#pragma once

#include "Log.hpp"
#include <iostream>
#include <cerrno>
#include <cstring>
#include <pthread.h>

typedef void *(*func_t)(void *);

// 线程数据
// struct ThreadData
// {
//     std::string _name;
//     void *_args;

//     ThreadData(const std::string& name, void *args)
//         : _name(name), _args(args)
//     { }
// };

class thread
{
public:
    thread(func_t func, void *args)
        : _func(func), _args(args)
    { }

    void start()
    {
        int n = pthread_create(&_id, nullptr, _func, _args);
        if(n != 0)
        {
            logMessage(FATAL, "创建线程失败, %d:%s\n", errno, strerror(errno));
            exit(1);
        }
    }

    void join()
    {
        int n = pthread_join(_id, nullptr);
        if(n != 0)
        {
            logMessage(FATAL, "等待线程失败, %d:%s\n", errno, strerror(errno));
            exit(2);
        }
    }

private:

    pthread_t _id;   // 线程id
    func_t _func;    // 线程函数
    void *_args;     // 线程函数参数
};